% -----------------------    1    -----------------------------------*

tipoDeTerrenoLimitrofe( T1, T2 ) :-
	tipoDeTerreno( P1, T1 ),
	tipoDeTerreno( P2, T2 ),
	limitrofe( P1, P2 ).

% -----------------------    2    -----------------------------------*

aliados( P1, P2 ) :- aliadosOneWay( P1, P2 ).
aliados( P1, P2 ) :- aliadosOneWay( P2, P1 ).

% -----------------------    3    -----------------------------------*

posicionGuerrero( G, P ) :- nombreGuerrero( Func, G ),  esta( P, Func ).

% -----------------------    4    -----------------------------------+

% Suma de ruido menor a 25
posicionFeliz( P ) :-
	ruidosEn( P, Rs ),
	not( length( Rs, 0 ) ),
	sumlist( Rs, Total ),
	Total < 25.

% Coordenadas multiplo de 3
posicionFeliz( P ) :-
	esPosicion( P ),
	coordenadas( P, X, Y ),
	X mod 3 =:= 0,
	Y mod 3 =:= 0.

% Al menos 1 Saiyajin nivel >= 3 y ningun monstruo
posicionFeliz( P ) :-
	esta( P, saiyajin( _, Nivel ) ),
	Nivel >= 3,
	forall( 
		esta( P, G ),
		not( esMonstruo( G ) )
	).

% Tiene al menos cuatro guerreros
posicionFeliz( P ) :-
	esPosicion( P ),
	findall( G, (
		esta( P, G ),
		esGuerrero( G )
	), Gs ),
	length( Gs, LGs ),
	LGs >= 4.

% -----------------------    5    -----------------------------------+

% Si es monstruo ya esta en peligro
estaEnPeligro( G ) :-
	esGuerrero( G ),
	nombreGuerrero( Func, G ),
	esMonstruo( Func ), !.
% Si esta rodeado
estaEnPeligro( G ) :- 
	esGuerrero( G ),
	estaRodeado( G ).

% -----------------------    6    -----------------------------------+

guerreroFeliz( G ) :-
	esGuerrero( G ),
	estaASalvo( G ),
	forall(
		aliados( G, A ),
		estaASalvo( A )
	).

% -----------------------    7    -----------------------------------*

puedeHacerRecorrido( [], G ) :- esGuerrero( G ).
puedeHacerRecorrido( [Pos|R], G ):-
	esGuerrero( G ),
	esPosicion( Pos ),
	puedePasar( G, Pos ),
	puedeHacerRecorrido( R, G ).

% -----------------------    8    -----------------------------------*

consigueFacil( G , Esferas ) :-
	esGuerrero( G ),
	findall( Num, (
		esta( Pos, esfera( Num ) ),
		posicionFacil( G, Pos )
	), Esferas ). 

% -----------------------    9    -----------------------------------*

recorridoEntre( Principio, Fin, Path ) :- 
	direccionRecorrido( Principio, Fin, Dir ), 
	recorrido( Principio, Fin, Dir, Path ).

% -----------------------    10    ----------------------------------*

puedeLlegar( Guerrero, Fin ) :-
	posicionGuerrero( Guerrero, Principio ),
	recorridoEntre( Principio, Fin, Path ),
	puedeHacerRecorrido( Path, Guerrero ).

% -----------------------    11    ----------------------------------*
puedeLlamarAShenLong( Guerrero ) :-
	esGuerrero( Guerrero ),
	forall( 
		esta( Pos, esfera(_) ),
		algunoPuedeLlegar( Guerrero, Pos ) 
	).